package com.whfc.emp.xxl.job;

import com.whfc.XxlJobConfig;
import com.whfc.emp.dto.WorkPlanPersonCheckResultDTO;
import com.whfc.emp.service.AppWorkPlanService;
import com.xxl.job.core.context.XxlJobHelper;
import com.xxl.job.core.handler.annotation.XxlJob;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.autoconfigure.condition.ConditionalOnBean;
import org.springframework.stereotype.Component;

import java.util.List;

/**
 * @Description: 工作计划人员数量校验定时任务
 * @version: 1.0
 * @date: 2024-01-01
 */
@Component
@ConditionalOnBean(XxlJobConfig.class)
public class WorkPlanPersonCountJob {

    private Logger logger = LoggerFactory.getLogger(this.getClass());

    @Autowired
    private AppWorkPlanService appWorkPlanService;

    /**
     * 工作计划人员数量自动校验任务
     * 执行频率：每5分钟执行一次
     * 任务描述：校验已审核且开始时间在当前时间前后5分钟内的工作计划中施工人员数量与监控上报人数是否一致
     */
    @XxlJob("workPlanPersonCountCheck")
    public void workPlanPersonCountCheck() {
        try {
            XxlJobHelper.log("开始执行工作计划人员数量自动校验任务");
            
            // 执行工作计划人员数量校验
            List<WorkPlanPersonCheckResultDTO> results = appWorkPlanService.checkWorkPlanPersonCount();
            
            // 记录执行结果
            if (results != null && !results.isEmpty()) {
                int inconsistentCount = 0;
                for (WorkPlanPersonCheckResultDTO result : results) {
                    if (!result.getCheckResult()) {
                        inconsistentCount++;
                        XxlJobHelper.log("工作计划【{}】人员数量不一致：计划人数={}，监控人数={}，报警消息：{}", 
                            result.getPlanName(), result.getPlanPersonCount(), 
                            result.getMonitorPersonCount(), result.getAlarmMessage());
                    }
                }
                
                XxlJobHelper.log("工作计划人员数量校验完成，共检查{}个工作计划，其中{}个存在人员数量不一致", 
                    results.size(), inconsistentCount);
            } else {
                XxlJobHelper.log("未发现需要校验的工作计划");
            }
            
            XxlJobHelper.log("工作计划人员数量自动校验任务执行完成");
            
        } catch (Exception ex) {
            String errorMsg = "工作计划人员数量自动校验任务执行失败：" + ex.getMessage();
            logger.error(errorMsg, ex);
            XxlJobHelper.handleFail(errorMsg);
        }
    }

    /**
     * 工作计划人员数量手动校验任务
     * 任务描述：手动触发工作计划人员数量校验，用于测试或紧急情况
     */
    @XxlJob("workPlanPersonCountCheckManual")
    public void workPlanPersonCountCheckManual() {
        try {
            XxlJobHelper.log("开始执行工作计划人员数量手动校验任务");
            
            // 获取任务参数（可用于指定特定时间范围等）
            String jobParam = XxlJobHelper.getJobParam();
            if (jobParam != null && !jobParam.trim().isEmpty()) {
                XxlJobHelper.log("任务参数：{}", jobParam);
            }
            
            // 执行工作计划人员数量校验
            List<WorkPlanPersonCheckResultDTO> results = appWorkPlanService.checkWorkPlanPersonCount();
            
            // 记录详细执行结果
            if (results != null && !results.isEmpty()) {
                XxlJobHelper.log("共检查{}个工作计划：", results.size());
                
                int consistentCount = 0;
                int inconsistentCount = 0;
                
                for (WorkPlanPersonCheckResultDTO result : results) {
                    if (result.getCheckResult()) {
                        consistentCount++;
                        XxlJobHelper.log("✓ 工作计划【{}】人员数量一致：计划人数={}，监控人数={}", 
                            result.getPlanName(), result.getPlanPersonCount(), result.getMonitorPersonCount());
                    } else {
                        inconsistentCount++;
                        XxlJobHelper.log("✗ 工作计划【{}】人员数量不一致：计划人数={}，监控人数={}，报警消息：{}", 
                            result.getPlanName(), result.getPlanPersonCount(), 
                            result.getMonitorPersonCount(), result.getAlarmMessage());
                    }
                }
                
                XxlJobHelper.log("校验结果统计：一致={}，不一致={}", consistentCount, inconsistentCount);
            } else {
                XxlJobHelper.log("未发现需要校验的工作计划");
            }
            
            XxlJobHelper.log("工作计划人员数量手动校验任务执行完成");
            
        } catch (Exception ex) {
            String errorMsg = "工作计划人员数量手动校验任务执行失败：" + ex.getMessage();
            logger.error(errorMsg, ex);
            XxlJobHelper.handleFail(errorMsg);
        }
    }
}